package model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

import persistence.InstituicaoDAO;

/**
 * A classe utilizada para representar um ve�culo que pode ser cedido por uma
 * <code>Instituicao</code>.
 * 
 * @author giovanni.surubim@gmail.com, p.romuloo@gmail.com
 * 
 */
public class Veiculo {

	/*
	 * Situa��es que o ve�culo pode est�.
	 */
	public static final String CONSULTADO = "consultado";
	public static final String INFORMADO = "informado";
	public static final String REQUISITADO = "requisitado";
	public static final String CEDIDO = "cedido";
	public static final String APRESENTADO = "apresentado";
	public static final String DEVOLVIDO = "devolvido";
	public static final String DESIGNADO = "designado";

	/*
	 * Categorias que o ve�culo pode pertencer.
	 */
	public static final String PASSEIO = "passeio";
	public static final String PICK_UP = "pick up";
	public static final String VAN = "van";
	public static final String CAMINHAO = "caminhao";
	public static final String CAMINHAO_BAU = "caminhao bau";
	public static final String OUTRO = "outro";

	/**
	 * Conjunto de categorias que o ve�culo pode pertencer.
	 */
	private static Collection<String> categoriasPossiveis;

	/**
	 * Conjunto de situa��es que o ve�culo pode est�.
	 */
	private static Collection<String> situacoesPossiveis;

	/*
	 * Valores indefinidos para n�meros inteiros e Strings.
	 */
	public static final int INDEFINIDO_INT = -1;
	public static final String INDEFINIDO_STR = "";

	/**
	 * Executado sempre que a classe Ve�culos � instanciada.
	 */
	static {
		if (categoriasPossiveis == null || situacoesPossiveis == null) {
			criaCategoriasESituacoes();
		}
	}

	/**
	 * Placa do ve�culo.
	 */
	private String placa = INDEFINIDO_STR;

	/**
	 * Categoria do ve�culo.
	 */
	private String categoria = INDEFINIDO_STR;

	/**
	 * Ano do ve�culo.
	 */
	private String ano; // INDEFINIDO_STR;

	/**
	 * Modelo do ve�culo.
	 */
	private String modelo = INDEFINIDO_STR;

	/**
	 * Situa��o do ve�culo.
	 */
	private String situacao = INDEFINIDO_STR;

	/**
	 * Cor do ve�culo.
	 */
	private String cor = INDEFINIDO_STR;

	/**
	 * Institui��o que pode ceder o ve�culo.
	 */
	private String instituicaoCedente = null;

	/**
	 * Vistorias j� realizadas nesse ve�culo.
	 */
	private Collection<Vistoria> vistorias = null;

	/**
	 * Construtor da classe Ve�clos sem par�metros. Todos os atributos iniciaram
	 * com valores indefinidos.
	 */
	public Veiculo() {

	}

	// TODO for test
	public Veiculo(String placa, String categoria, String situacao,
			String instituicaoCedente) {
		this.placa = placa;
		this.categoria = categoria;
		this.situacao = situacao;
		this.instituicaoCedente = instituicaoCedente;
	}

	// TODO for test
	public Veiculo(String placa, String categoria, String situacao,
			String instituicaoCedente, Collection<Vistoria> vistorias) {
		this.placa = placa;
		this.categoria = categoria;
		this.situacao = situacao;
		this.instituicaoCedente = instituicaoCedente;
		this.vistorias = vistorias;
	}

	/**
	 * Cria o conjunto de categorias e de situa��es que o ve�culo possui.
	 */
	private static void criaCategoriasESituacoes() {
		categoriasPossiveis = new ArrayList<String>();
		Collections.addAll(categoriasPossiveis, PASSEIO, VAN, CAMINHAO,
				CAMINHAO_BAU, OUTRO);
		situacoesPossiveis = new ArrayList<String>();
		Collections.addAll(situacoesPossiveis, INFORMADO, CONSULTADO,
				REQUISITADO, CEDIDO, APRESENTADO, DESIGNADO, DEVOLVIDO);
	}

	public String getPlaca() {
		return placa;
	}

	public void setPlaca(String placa) {
		this.placa = placa;
	}

	public String getCategoria() {
		return categoria;
	}

	public void setCategoria(String categoria) {
		this.categoria = categoria;
	}

	public String getAno() {
		return ano;
	}

	public void setAno(String ano) {
		this.ano = ano;
	}

	public String getModelo() {
		return modelo;
	}

	public void setModelo(String modelo) {
		this.modelo = modelo;
	}

	public String getSituacao() {
		return situacao;
	}

	public void setSituacao(String situacao) {
		this.situacao = situacao;
	}

	public String getInstituicaoCedente() {
		return instituicaoCedente;
	}

	public void setInstituicaoCedente(String instituicaoCedente) {
		this.instituicaoCedente = instituicaoCedente;
	}

	public static Collection<String> getCategoriasPossiveis() {
		// if (categoriaVeiculos == null || categoriaVeiculos.size() == 0){
		// criaCategorias();
		// }
		return categoriasPossiveis;
	}

	// TODO
	public String toString() {
		return "placa: " + this.placa + " vist: " + vistorias;
	}

	public static void setCategoriasPossiveis(
			Collection<String> categoriasPossiveis) {
		Veiculo.categoriasPossiveis = categoriasPossiveis;
	}

	public static Collection<String> getSituacoesPossiveis() {
		return situacoesPossiveis;
	}

	public static void setSituacoesPossiveis(
			Collection<String> situacoesPossiveis) {
		Veiculo.situacoesPossiveis = situacoesPossiveis;
	}

	public Collection<Vistoria> getVistorias() {
		return vistorias;
	}

	public void setVistorias(Collection<Vistoria> vistorias) {
		this.vistorias = vistorias;
	}

	public String getCor() {
		return cor;
	}

	public void setCor(String cor) {
		this.cor = cor;
	}
}
